#pragma once

#include "iostream"
#include "vector"
#include "algorithm"

using namespace std;
/*HJJ QQ479287006
 *给定两个整数 n 和 k，返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

 

示例 1：

输入：n = 4, k = 2
输出：
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]
示例 2：

输入：n = 1, k = 1
输出：[[1]]

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/combinations
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * */

//一般找到一条路径需要返回就加返回值
vector<vector<int>> ret;
vector<int> temp;

void combineBack(int n, int k, int startIndex) {
    if (temp.size() == k) {
        ret.push_back(temp);
        return;
    }

    for (int i = startIndex; i <= n; ++i) {
        temp.push_back(i);
        combineBack(n, k, i + 1);
        temp.pop_back();
    }


}

vector<vector<int>> combine(int n, int k) {
    combineBack(n, k, 1);
    return ret;
}